home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / CW GUSI 1.6.4 / Examples / GUSIAtlkTest.c < prev    next >
C/C++ Source or Header  |  1995-01-23  |  4KB  |  198 lines

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIAtlkTest    -    Test appletalk sockets
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Language    :    MPW C
  6.  
  7. $Log: GUSIAtlkTest.c,v $
  8. Revision 1.2  1994/12/31  01:05:05  neeri
  9. ANSIfy (omitting parameter names was illegal).
  10.  
  11. Revision 1.1  1994/02/25  02:46:44  neeri
  12. Initial revision
  13.  
  14. Revision 0.6  1992/10/14  00:00:00  neeri
  15. Fix usage messages
  16.  
  17. Revision 0.5  1992/09/08  00:00:00  neeri
  18. Factor out more common code
  19.  
  20. Revision 0.4  1992/07/31  00:00:00  neeri
  21. Test select()
  22.  
  23. Revision 0.3  1992/07/26  00:00:00  neeri
  24. Rewrote for symbolic adresses and new testing gear.
  25.  
  26. Revision 0.2  1992/05/13  00:00:00  neeri
  27. Adapted for AppleTalk sockets
  28.  
  29. Revision 0.1  1992/04/17  00:00:00  neeri
  30. Handle SIOW activate/update
  31.  
  32. *********************************************************************/
  33.  
  34. #include <GUSI.h>
  35. #include "GUSITest.h"
  36. #include <stdio.h>
  37. #include <fcntl.h>
  38. #include <stdlib.h>
  39. #include <errno.h>
  40. #include <string.h>
  41.  
  42. #include "Events.h"
  43.  
  44. extern int GUSIDefaultSpin(spin_msg, long);
  45.  
  46. sa_constr_atlk    Constr    =    {
  47.     1,
  48.     {
  49.         {
  50.             nil, "\pGUSIAtlkTest"
  51.         },
  52.         {
  53.             nil, ""
  54.         },
  55.         {
  56.             nil, ""
  57.         },
  58.         {
  59.             nil, ""
  60.         }
  61.     }
  62. };
  63.  
  64. void Socket(char ch1, char ch2, const char * line)
  65. {
  66.     sock    =    socket(AF_APPLETALK, SOCK_STREAM, 0);
  67.     
  68.     if (sock == -1)    {
  69.         printf("# socket() returned error %s\n", Explain());
  70.         Where();
  71.     }
  72. }
  73.  
  74. void Bind(char ch1, char ch2, const char * cmd)
  75. {
  76.     struct sockaddr_atlk_sym    addr;
  77.     Str63                            obj;
  78.  
  79.     if (sock == -1)    {
  80.         printf("# socket is not open\n");
  81.         Where();
  82.         
  83.         return;
  84.     }
  85.  
  86.     if (sscanf(cmd, "%s", (char *) (obj+1)) == 1) {
  87.         addr.family    =    ATALK_SYMADDR;
  88.         obj[0]    =    strlen((char *) (obj+1));
  89.         NBPSetEntity((Ptr) &addr.name, obj, "\pGUSIAtlkTest", "\p*");
  90.     } else {
  91.         Usage(ch1, ch2);
  92.                 
  93.         return;
  94.     }
  95.  
  96.     if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_atlk_sym)))    {
  97.         printf("bind(\"%s\") returned error %s\n", (char *) (obj+1), Explain());
  98.         Where();
  99.     }
  100. }
  101.  
  102. void Accept(char ch1, char ch2, const char * line)
  103. {
  104.     int                        len;
  105.     struct sockaddr_atlk    addr;
  106.  
  107.     if (sock == -1)    {
  108.         printf("# socket is not open\n");
  109.         Where();
  110.         
  111.         return;
  112.     }
  113.     if (accsock != -1)    {
  114.         printf("# can't accept more than one connection\n");
  115.         Where();
  116.         
  117.         return;
  118.     }
  119.  
  120.     len    =    sizeof(struct sockaddr_atlk);
  121.     sock    =    accept(accsock = sock, (struct sockaddr *) &addr, &len);
  122.     
  123.     if (sock < 0)    {
  124.         printf("# accept() returned error %s\n", Explain());
  125.         sock        =    accsock;
  126.         accsock    =    -1;
  127.     } else
  128.         printf(
  129.             "# accepted connection from [%d]%d:%d\n", 
  130.             addr.addr.aNet, 
  131.             addr.addr.aNode,
  132.             addr.addr.aSocket);
  133.     
  134.     Where();
  135. }
  136.     
  137. void Connect(char ch1, char ch2, const char * cmd)
  138. {
  139.     int                                len;
  140.     struct sockaddr_atlk_sym    symaddr;
  141.     struct sockaddr_atlk            numaddr;
  142.     Str63                                obj;
  143.  
  144.     if (sock == -1)    {
  145.         printf("# socket is not open\n");
  146.         Where();
  147.         
  148.         return;
  149.     }
  150.  
  151.     if (sscanf(cmd, "%s", (char *) (obj+1)) == 1) {
  152.         symaddr.family    =    ATALK_SYMADDR;
  153.         obj[0]    =    strlen((char *) (obj+1));
  154.         NBPSetEntity((Ptr) &symaddr.name, obj, "\pGUSIAtlkTest", "\p*");
  155.  
  156.         if (connect(sock, (struct sockaddr *) &symaddr, sizeof(struct sockaddr_atlk_sym)))    {
  157.             printf("# connect(\"%s\") returned error %s\n", (char *) (obj+1), Explain());
  158.             Where();
  159.         }
  160.     } else {
  161.         len = sizeof(struct sockaddr_atlk);
  162.         
  163.         if (choose(AF_APPLETALK, 0, "Yeah ?", &Constr, 0, &numaddr, &len))    {
  164.             printf("# choose() returned error %s\n", Explain());
  165.             Where();
  166.             
  167.             return;
  168.         }
  169.  
  170.         if (connect(sock, (struct sockaddr *) &numaddr, len))    {
  171.             printf(
  172.                 "# connect([%d]%d:%d) returned error %s\n", 
  173.                 numaddr.addr.aNet, 
  174.                 numaddr.addr.aNode,
  175.                 numaddr.addr.aSocket,
  176.                 Explain());
  177.             Where();
  178.         }
  179.     }
  180. }    
  181.  
  182. main(int argc, char ** argv)
  183. {
  184.     GUSISetup(GUSIwithSIOUXSockets);
  185.     GUSISetup(GUSIwithAppleTalkSockets);
  186.     
  187.     printf("GUSIAtlkTest        MN 10Jun94\n\n");
  188.  
  189.     COMMAND('s', 's', Socket,  "",                 "Create a stream socket");
  190.     COMMAND('a', 'c', Accept,  "",                 "Accept a connection");
  191.     COMMAND('b', 'd', Bind,      "objectname",     "Bind to address");
  192.     COMMAND('c', 'o', Connect, "[objectname]","Connect to address");
  193.     
  194.     AddSocketCommands();
  195.     
  196.     RunTest(argc, argv);
  197.     CleanupSockets();
  198. }